#include <esp_sleep.h>
#include <freertos/FreeRTOS.h>
#include <freertos/task.h>
#include <Arduino.h>
#include <driver/uart.h>
#include "fpga_reciver.h"
#include "adc_power.h"

// 定义引脚
const int buttonPin = 18; // 按钮连接到 GPIO18
const int pulsePin = 17;  // 脉冲信号输出到 GPIO17
const int resetnPin = 15; // FPGA 复位引脚连接到 GPIO15

// 添加帧标记定义
const uint8_t START_MARKER = 0x55;  // 起始标记
const uint8_t END_MARKER = 0xAA;    // 结束标记

// 全局变量
volatile bool buttonPressed = false;
volatile bool allowPulse = false; // 控制脉冲输出
volatile unsigned long lastInterruptTime = 0;
const unsigned long debounceDelay = 50; // 去抖动时间（毫秒）
volatile bool enableButton = false; // 按钮使能标志
const uint32_t BOOT_SILENT_TIME = 2000; // 开机静默期 2 秒
uint32_t bootStartTime = 0; // 开机时间戳

// 外部变量（从 fpga_reciver.cpp）
extern short H_data;
extern short L_data;

// 按钮中断处理
void IRAM_ATTR handleButtonPress() {
    unsigned long currentTime = millis();
    if (!enableButton) return; // 静默期内不响应
    if (currentTime - lastInterruptTime > debounceDelay) {
        buttonPressed = true;
        lastInterruptTime = currentTime;
    }
}

// 使能按钮任务（设置开机静默期）
void enableButtonTask(void* pvParameters) {
    while (millis() - bootStartTime < BOOT_SILENT_TIME) {
        vTaskDelay(100 / portTICK_PERIOD_MS);
    }
    enableButton = true;
    attachInterrupt(digitalPinToInterrupt(buttonPin), handleButtonPress, FALLING);
    vTaskDelete(NULL);
}

// 发送位移数据的 FreeRTOS 任务
void SendDisplacementTask(void* pvParameters) {
    uint8_t txBuffer[6];
    const int SEND_INTERVAL = 1000;  // 可调整的发送间隔(ms)
    
    while (1) {
        // 组装二进制数据包
        txBuffer[0] = START_MARKER;          // 0x55起始
        txBuffer[1] = (uint8_t)(H_data >> 8);    // H_data高字节
        txBuffer[2] = (uint8_t)(H_data & 0xFF);  // H_data低字节
        txBuffer[3] = (uint8_t)(L_data >> 8);    // L_data高字节
        txBuffer[4] = (uint8_t)(L_data & 0xFF);  // L_data低字节
        txBuffer[5] = END_MARKER;           // 0xAA结束
        
        Serial0.write(txBuffer, sizeof(txBuffer));
        vTaskDelay(SEND_INTERVAL / portTICK_PERIOD_MS);  // 调整发送间隔
    }
}

void setup() {
    // 初始化引脚
    pinMode(pulsePin, OUTPUT);
    pinMode(resetnPin, OUTPUT);
    digitalWrite(pulsePin, HIGH); // 初始化为高电平
    digitalWrite(resetnPin, HIGH); // 初始化为高电平

    // 输出 100ms 复位负脉冲
    digitalWrite(resetnPin, LOW);
    delay(100);
    digitalWrite(resetnPin, HIGH);

    // 初始化串口
    Serial0.begin(115200, SERIAL_8N1, -1, -1, false);
    Serial0.setDebugOutput(0);

    // 初始化 ADC 和 FPGA 接收器
    ADC_power_init();
    fpga_reciver_init();

    // 记录开机时间
    bootStartTime = millis();

    // 创建任务
    xTaskCreatePinnedToCore(SendDisplacementTask, "SendDisplacement", 2048, NULL, 1, NULL, 1);
    xTaskCreatePinnedToCore(enableButtonTask, "enableBtn", 2048, NULL, 1, NULL, 0);

    // 初始化按钮
    pinMode(buttonPin, INPUT_PULLUP);
    digitalRead(buttonPin); // 清除潜在中断标志
    delay(10);

    // 允许脉冲输出
    allowPulse = true;
}

void loop() {
    // 处理按钮触发脉冲
    if (buttonPressed && allowPulse) {
        buttonPressed = false;
        digitalWrite(pulsePin, LOW);
        delay(100);
        digitalWrite(pulsePin, HIGH);
    }
    vTaskDelay(10 / portTICK_PERIOD_MS);
}